package com.flong.spring.config;

import com.flong.spring.aop.LogAspects;
import com.flong.spring.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @Author:liangjl
 * @Date: 2020/6/12-21:38
 * @Eamil:jilongliang@sina.com
 * @Description:
 *
 * AOP：[动态代理]
 *   指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式
 *   1、导入aop模块，Spring AOP，Spring-aspects
 *   2、定义一个业务逻辑类
 *   3、定义一个日志切面类(LogAspects),切面类里面的方法需要动态干燥（MathCalculator#div）运行到
 *    通知方法
 *          前置通知(@Before) ：logStart 在目标方法div运行之前运行
 *          后置通知(@After)：logEnd 在目标方法div运行结束之后运行
 *          返回通知(@AfterReturning)：logRet 在目标方法div正常返回之后运行
 *          异常通知(@AfterThrowing) ：logExce 在目标方法div异常之后运行
 *          环绕通知 ：动态代理，手动推进目标方法运行（joinPoint）
 *    4、给切面类的目标方法标注何时地运行(通知注解)
 *    5、将切面类和业务逻辑类（目标方法所在类）都加入到容器中
 *    6、必须告诉Spring那个类是切面（给切面类上加一个注解 @Aspect）
 *    7、启动AOP，需要EnableAspectJAutoProxy注解
 *
 *  三部曲
 *  1、将业务逻辑组件和切面类都加入到容器中，告诉Spring那个是切面（@Aspect）
 *  2、在切面类上的每一个通知方法上标注通知注解，告诉Spring何时何地运行（切入点表达式）
 *  3、开启基于注解的aop模式
 *
 * AOP原理
 * 　＠EnableAspectJAutoProxy
 * 　 1、EnableAspectJAutoProxy是什么，@Import(AspectJAutoProxyRegistrar.class)，给容器导入EnableAspectJAutoProxy
 *　　2、AnnotationAwareAspectJAutoProxyCreator
 */
@EnableAspectJAutoProxy
@Configuration
public class ConfigOfAOP {

    @Bean
    public  MathCalculator mathCalculator(){
        return new MathCalculator();
    }

    @Bean
    public LogAspects LogAspects(){
        return  new LogAspects();
    }
}
